# ============================================================================
# 编译缓存加速配置模块
# ============================================================================
# 提供 sccache (Windows) 和 ccache (Linux) 的配置
# ============================================================================

if(WIN32 AND MSVC)
    # ========================================================================
    # Windows + MSVC: 使用 sccache
    # ========================================================================
    message(STATUS "========================================")
    message(STATUS "检测编译加速工具: sccache")
    message(STATUS "========================================")
    
    # 检查生成器类型：Ninja 时禁用 sccache（兼容性问题）
    if(CMAKE_GENERATOR MATCHES "Ninja")
        message(STATUS "⚠️  检测到 Ninja 生成器，跳过 sccache")
        message(STATUS "   原因: Ninja + sccache + MSVC 存在兼容性问题")
        message(STATUS "   推荐: 使用 Visual Studio 生成器 + sccache")
        message(STATUS "")
        message(STATUS "💡 切换到 Visual Studio 生成器:")
        message(STATUS "   cmake -G \"Visual Studio 17 2022\" -A x64 ..")
        message(STATUS "========================================")
        set(SCCACHE_PROGRAM "")  # 强制禁用
    else()
        # 优先从项目 tools 目录查找 sccache
        find_program(SCCACHE_PROGRAM 
            NAMES sccache sccache.exe
            PATHS 
                "${CMAKE_SOURCE_DIR}/tools"
                "${CMAKE_SOURCE_DIR}/tools/sccache"
            NO_DEFAULT_PATH
        )
        
        # 如果 tools 目录没有，再从系统 PATH 查找
        if(NOT SCCACHE_PROGRAM)
            find_program(SCCACHE_PROGRAM sccache)
        endif()
    endif()
    
    if(SCCACHE_PROGRAM)
        # 找到 sccache
        message(STATUS "✅ 找到 sccache: ${SCCACHE_PROGRAM}")
        message(STATUS "")
        message(STATUS "========================================")
        message(STATUS "✅ 编译加速: sccache")
        message(STATUS "========================================")
        message(STATUS "sccache 路径: ${SCCACHE_PROGRAM}")
        
        # 设置编译器启动器
        set(CMAKE_C_COMPILER_LAUNCHER "${SCCACHE_PROGRAM}" CACHE STRING "C compiler launcher")
        set(CMAKE_CXX_COMPILER_LAUNCHER "${SCCACHE_PROGRAM}" CACHE STRING "CXX compiler launcher")
        
        # 配置 sccache + Visual Studio + MSVC
        if(CMAKE_GENERATOR MATCHES "Makefiles")
            # Makefiles 默认也会使用 /showIncludes，需要禁用
            set(CMAKE_C_DEPENDS_USE_COMPILER FALSE CACHE BOOL "" FORCE)
            set(CMAKE_CXX_DEPENDS_USE_COMPILER FALSE CACHE BOOL "" FORCE)
            message(STATUS "   ✅ 已禁用 /showIncludes（无乱码输出）")
        endif()
        
        # ========================================================================
        # 集成 start_sccache.ps1 的功能：检测并修复缓存目录配置
        # ========================================================================
        # 期望的缓存目录（构建目录下的 .sccache）
        set(EXPECTED_SCCACHE_DIR "${CMAKE_BINARY_DIR}/.sccache")
        
        # 检测当前 sccache 的缓存目录配置
        set(SCCACHE_CURRENT_DIR "")
        set(SCCACHE_NEEDS_FIX FALSE)
        
        # 方法1: 从环境变量获取
        if(DEFINED ENV{SCCACHE_DIR})
            set(SCCACHE_CURRENT_DIR "$ENV{SCCACHE_DIR}")
        endif()
        
        # 方法2: 如果环境变量未设置，尝试从 sccache 统计信息中获取
        if(SCCACHE_CURRENT_DIR STREQUAL "")
            execute_process(
                COMMAND ${SCCACHE_PROGRAM} --show-stats
                OUTPUT_VARIABLE SCCACHE_STATS_OUTPUT
                ERROR_VARIABLE SCCACHE_STATS_ERROR
                OUTPUT_STRIP_TRAILING_WHITESPACE
                ERROR_STRIP_TRAILING_WHITESPACE
                RESULT_VARIABLE SCCACHE_STATS_RESULT
            )
            
            # 从输出中提取缓存位置（格式: "Cache location: <path>"）
            if(SCCACHE_STATS_OUTPUT MATCHES "Cache location:[ \t]+([^\r\n]+)")
                set(SCCACHE_CURRENT_DIR "${CMAKE_MATCH_1}")
                string(STRIP "${SCCACHE_CURRENT_DIR}" SCCACHE_CURRENT_DIR)
            endif()
        endif()
        
        # 规范化路径（转换为绝对路径并统一分隔符）
        if(SCCACHE_CURRENT_DIR)
            get_filename_component(SCCACHE_CURRENT_DIR "${SCCACHE_CURRENT_DIR}" ABSOLUTE)
        endif()
        get_filename_component(EXPECTED_SCCACHE_DIR "${EXPECTED_SCCACHE_DIR}" ABSOLUTE)
        
        # 检查缓存目录是否正确
        if(SCCACHE_CURRENT_DIR AND NOT SCCACHE_CURRENT_DIR STREQUAL EXPECTED_SCCACHE_DIR)
            message(STATUS "⚠️  检测到 sccache 缓存目录配置不正确:")
            message(STATUS "   当前目录: ${SCCACHE_CURRENT_DIR}")
            message(STATUS "   期望目录: ${EXPECTED_SCCACHE_DIR}")
            message(STATUS "")
            message(STATUS "🔧 自动修复中...")
            set(SCCACHE_NEEDS_FIX TRUE)
        endif()
        
        # 设置正确的缓存目录（如果未设置或需要修复）
        if(NOT DEFINED ENV{SCCACHE_DIR} OR SCCACHE_NEEDS_FIX)
            set(ENV{SCCACHE_DIR} "${EXPECTED_SCCACHE_DIR}")
            message(STATUS "✅ 已设置 SCCACHE_DIR=${EXPECTED_SCCACHE_DIR}")
        endif()
        
        # 设置缓存大小（如果未设置）
        if(NOT DEFINED ENV{SCCACHE_CACHE_SIZE})
            set(ENV{SCCACHE_CACHE_SIZE} "50G")
            message(STATUS "✅ 已设置 SCCACHE_CACHE_SIZE=50G")
        endif()
        
        # 确保缓存目录存在
        file(MAKE_DIRECTORY "${EXPECTED_SCCACHE_DIR}")
        
        # 如果需要修复，自动重启 sccache 服务
        if(SCCACHE_NEEDS_FIX)
            message(STATUS "")
            message(STATUS "🔄 重启 sccache 服务以应用新配置...")
            
            # 停止现有服务
            execute_process(
                COMMAND ${SCCACHE_PROGRAM} --stop-server
                OUTPUT_QUIET
                ERROR_QUIET
                RESULT_VARIABLE STOP_RESULT
            )
            
            # 等待服务完全停止
            execute_process(
                COMMAND ${CMAKE_COMMAND} -E sleep 2
                OUTPUT_QUIET
                ERROR_QUIET
            )
            
            # 使用正确的环境变量启动服务
            if(WIN32)
                # Windows: 使用 PowerShell 设置环境变量并启动服务
                execute_process(
                    COMMAND PowerShell -Command "& {$env:SCCACHE_DIR='${EXPECTED_SCCACHE_DIR}'; $env:SCCACHE_CACHE_SIZE='50G'; & '${SCCACHE_PROGRAM}' --start-server}"
                    OUTPUT_VARIABLE START_OUTPUT
                    ERROR_VARIABLE START_ERROR
                    OUTPUT_STRIP_TRAILING_WHITESPACE
                    ERROR_STRIP_TRAILING_WHITESPACE
                    RESULT_VARIABLE START_RESULT
                )
            else()
                # Linux/macOS: 使用环境变量启动服务
                execute_process(
                    COMMAND ${CMAKE_COMMAND} -E env "SCCACHE_DIR=${EXPECTED_SCCACHE_DIR}" "SCCACHE_CACHE_SIZE=50G" ${SCCACHE_PROGRAM} --start-server
                    OUTPUT_VARIABLE START_OUTPUT
                    ERROR_VARIABLE START_ERROR
                    OUTPUT_STRIP_TRAILING_WHITESPACE
                    ERROR_STRIP_TRAILING_WHITESPACE
                    RESULT_VARIABLE START_RESULT
                )
            endif()
            
            # 验证配置
            if(START_RESULT EQUAL 0)
                message(STATUS "✅ sccache 服务已重启")
                
                # 验证缓存目录是否正确
                execute_process(
                    COMMAND ${SCCACHE_PROGRAM} --show-stats
                    OUTPUT_VARIABLE VERIFY_OUTPUT
                    ERROR_VARIABLE VERIFY_ERROR
                    OUTPUT_STRIP_TRAILING_WHITESPACE
                    ERROR_STRIP_TRAILING_WHITESPACE
                    RESULT_VARIABLE VERIFY_RESULT
                )
                
                if(VERIFY_OUTPUT MATCHES "Cache location:[ \t]+([^\r\n]+)")
                    string(STRIP "${CMAKE_MATCH_1}" VERIFIED_DIR)
                    get_filename_component(VERIFIED_DIR "${VERIFIED_DIR}" ABSOLUTE)
                    if(VERIFIED_DIR STREQUAL EXPECTED_SCCACHE_DIR)
                        message(STATUS "✅ 缓存目录配置验证成功: ${VERIFIED_DIR}")
                    else()
                        message(WARNING "⚠️  缓存目录验证失败: ${VERIFIED_DIR} (期望: ${EXPECTED_SCCACHE_DIR})")
                    endif()
                endif()
            else()
                message(WARNING "⚠️  sccache 服务重启失败，请手动运行:")
                if(WIN32)
                    message(WARNING "   PowerShell -ExecutionPolicy Bypass -File tools/start_sccache.ps1 \"${CMAKE_BINARY_DIR}\" \"50G\"")
                else()
                    message(WARNING "   export SCCACHE_DIR=\"${EXPECTED_SCCACHE_DIR}\"")
                    message(WARNING "   sccache --stop-server && sccache --start-server")
                endif()
            endif()
            message(STATUS "")
        endif()
        
        # 显示最终配置
        message(STATUS "缓存目录: ${EXPECTED_SCCACHE_DIR}")
        message(STATUS "最大缓存: $ENV{SCCACHE_CACHE_SIZE}")
        
        # 提示信息
        message(STATUS "")
        message(STATUS "💡 重要提示:")
        message(STATUS "   如果 sccache 服务已启动但使用了错误的缓存目录，请运行:")
        if(WIN32)
            message(STATUS "   PowerShell -ExecutionPolicy Bypass -File tools/start_sccache.ps1 \"${CMAKE_BINARY_DIR}\" \"50G\"")
            message(STATUS "   或使用 CMake 目标: cmake --build . --target sccache-restart")
        else()
            message(STATUS "   export SCCACHE_DIR=\"${CMAKE_BINARY_DIR}/.sccache\"")
            message(STATUS "   sccache --stop-server && sccache --start-server")
        endif()
        
        message(STATUS "")
        message(STATUS "📊 预期加速效果:")
        message(STATUS "   首次编译: 正常速度（建立缓存）")
        message(STATUS "   后续编译: 10-100 倍加速 ⚡⚡⚡")
        message(STATUS "")
        message(STATUS "💡 实用命令:")
        message(STATUS "   查看统计: sccache --show-stats")
        message(STATUS "   清空缓存: sccache --stop-server")
        message(STATUS "   清零统计: sccache --zero-stats")
        message(STATUS "")
        message(STATUS "💡 CMake 目标:")
        message(STATUS "   cmake --build . --target sccache-stats    # 查看统计")
        message(STATUS "   cmake --build . --target sccache-clean    # 清理缓存")
        message(STATUS "   cmake --build . --target sccache-restart  # 重启服务")
        message(STATUS "")
        message(STATUS "📖 详细文档: docs/sccache使用指南.md")
        message(STATUS "========================================")
        
        # 创建便捷的 CMake 目标用于管理 sccache
        add_custom_target(sccache-stats
            COMMAND ${SCCACHE_PROGRAM} --show-stats
            COMMENT "查看 sccache 缓存统计"
            VERBATIM
        )
        
        add_custom_target(sccache-clean
            COMMAND ${SCCACHE_PROGRAM} --stop-server
            COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_BINARY_DIR}/.sccache"
            COMMAND ${CMAKE_COMMAND} -E echo "✅ sccache 缓存已清理 (${CMAKE_BINARY_DIR}/.sccache)"
            COMMENT "清理 sccache 缓存（释放磁盘空间）"
            VERBATIM
        )
        
        # 创建 sccache 启动脚本
        set(SCCACHE_START_SCRIPT "${CMAKE_SOURCE_DIR}/tools/start_sccache.ps1")
        if(EXISTS "${SCCACHE_START_SCRIPT}")
            add_custom_target(sccache-restart
                COMMAND ${CMAKE_COMMAND} -E echo "⏳ 停止现有服务..."
                COMMAND ${SCCACHE_PROGRAM} --stop-server
                COMMAND ${CMAKE_COMMAND} -E echo "⏳ 等待 2 秒..."
                COMMAND ${CMAKE_COMMAND} -E sleep 2
                COMMAND PowerShell -ExecutionPolicy Bypass -File "${SCCACHE_START_SCRIPT}" "${CMAKE_BINARY_DIR}" "50G"
                COMMAND ${CMAKE_COMMAND} -E echo "✅ sccache 服务已重启"
                COMMENT "重启 sccache 服务（使用正确的缓存目录）"
                VERBATIM
            )
        else()
            add_custom_target(sccache-restart
                COMMAND ${CMAKE_COMMAND} -E echo "⚠️  警告: 未找到启动脚本，请手动设置 SCCACHE_DIR 环境变量"
                COMMAND ${CMAKE_COMMAND} -E echo "   建议: \$env:SCCACHE_DIR = \"${CMAKE_BINARY_DIR}/.sccache\""
                COMMAND ${SCCACHE_PROGRAM} --stop-server
                COMMAND ${CMAKE_COMMAND} -E echo "⏳ 等待 2 秒..."
                COMMAND ${CMAKE_COMMAND} -E sleep 2
                COMMAND ${CMAKE_COMMAND} -E env "SCCACHE_DIR=${CMAKE_BINARY_DIR}/.sccache" "SCCACHE_CACHE_SIZE=50G" ${SCCACHE_PROGRAM} --start-server
                COMMAND ${CMAKE_COMMAND} -E echo "✅ sccache 服务已重启"
                COMMENT "重启 sccache 服务"
                VERBATIM
            )
        endif()
        
        add_custom_target(sccache-zero-stats
            COMMAND ${SCCACHE_PROGRAM} --zero-stats
            COMMAND ${CMAKE_COMMAND} -E echo "✅ sccache 统计已清零"
            COMMENT "清零 sccache 统计计数器（保留缓存）"
            VERBATIM
        )
    else()
        # 未找到 sccache
        if(CMAKE_GENERATOR MATCHES "Ninja")
            message(STATUS "========================================")
            message(STATUS "⚠️  Ninja 生成器: sccache 已禁用")
            message(STATUS "========================================")
            message(STATUS "将使用标准 Ninja + MSVC 编译")
            message(STATUS "")
            message(STATUS "💡 要启用 10-100 倍编译加速:")
            message(STATUS "   切换到 Visual Studio 生成器:")
            message(STATUS "   cmake -G \"Visual Studio 17 2022\" -A x64 ..")
            message(STATUS "========================================")
        else()
            message(STATUS "========================================")
            message(STATUS "⚠️  未找到 sccache")
            message(STATUS "========================================")
            message(STATUS "将使用标准 MSVC 编译（无缓存加速）")
            message(STATUS "")
            message(STATUS "💡 要启用 10-100 倍编译加速:")
            message(STATUS "")
            message(STATUS "1️⃣  下载 sccache 到 tools 目录（推荐）")
            message(STATUS "   https://github.com/mozilla/sccache/releases")
            message(STATUS "   解压到: ${CMAKE_SOURCE_DIR}/tools/")
            message(STATUS "")
            message(STATUS "2️⃣  重新运行 CMake 配置")
            message(STATUS "")
            message(STATUS "📖 详细文档: docs/sccache使用指南.md")
            message(STATUS "========================================")
            
            # Visual Studio 生成器：启用多核编译
            add_compile_options(/MP)
        endif()
    endif()
    
elseif(UNIX)
    # ========================================================================
    # Linux/macOS: 自动配置 ccache 和 distcc
    # ========================================================================
    
    # 检查 ccache 是否安装
    find_program(CCACHE_PROGRAM ccache)
    
    # 检查 distcc 是否安装
    find_program(DISTCC_PROGRAM distcc)
    
    # 配置 ccache
    if(CCACHE_PROGRAM)
        message(STATUS "========================================")
        message(STATUS "✅ 编译加速: ccache")
        message(STATUS "========================================")
        message(STATUS "ccache 路径: ${CCACHE_PROGRAM}")
        
        # 将 ccache 缓存目录放在构建目录下（如 Build/build64_debug/.ccache）
        set(CCACHE_DIR "${CMAKE_BINARY_DIR}/.ccache")
        
        # 如果环境变量已设置，使用环境变量的值（优先级更高）
        if(DEFINED ENV{CCACHE_DIR})
            set(CCACHE_DIR "$ENV{CCACHE_DIR}")
        endif()
        
        # 设置 ccache 环境变量
        set(ENV{CCACHE_DIR} "${CCACHE_DIR}")
        if(NOT DEFINED ENV{CCACHE_MAXSIZE})
            set(ENV{CCACHE_MAXSIZE} "50G")
        endif()
        set(ENV{CCACHE_COMPRESS} "true")
        set(ENV{CCACHE_COMPRESSLEVEL} "5")
        
        # 创建缓存目录
        file(MAKE_DIRECTORY "${CCACHE_DIR}")
        
        # 🔥 关键：创建本地 ccache 配置文件
        # ccache 会优先读取构建目录下的 ccache.conf 配置文件
        set(CCACHE_CONFIG_FILE "${CMAKE_BINARY_DIR}/ccache.conf")
        file(WRITE "${CCACHE_CONFIG_FILE}" "# ccache 配置文件（由 CMake 自动生成）
# 缓存目录
cache_dir = ${CCACHE_DIR}
# 最大缓存大小
max_size = $ENV{CCACHE_MAXSIZE}
# 启用压缩
compression = true
compression_level = 5
# 其他优化选项
sloppiness = file_macro,time_macros,include_file_mtime,include_file_ctime
")
        
        # 设置环境变量指向本地配置文件
        set(ENV{CCACHE_CONFIGPATH} "${CCACHE_CONFIG_FILE}")
        
        # 使用 ccache 命令设置配置（写入到用户配置文件）
        execute_process(
            COMMAND ${CCACHE_PROGRAM} -o cache_dir="${CCACHE_DIR}"
            OUTPUT_QUIET
            ERROR_QUIET
            RESULT_VARIABLE CCACHE_CONFIG_RESULT
        )
        execute_process(
            COMMAND ${CCACHE_PROGRAM} -o max_size=$ENV{CCACHE_MAXSIZE}
            OUTPUT_QUIET
            ERROR_QUIET
        )
        execute_process(
            COMMAND ${CCACHE_PROGRAM} -o compression=true
            OUTPUT_QUIET
            ERROR_QUIET
        )
        execute_process(
            COMMAND ${CCACHE_PROGRAM} -o compression_level=5
            OUTPUT_QUIET
            ERROR_QUIET
        )
        
        message(STATUS "缓存目录: ${CCACHE_DIR}")
        message(STATUS "配置文件: ${CCACHE_CONFIG_FILE}")
        message(STATUS "最大缓存: $ENV{CCACHE_MAXSIZE}")
        if(CCACHE_CONFIG_RESULT EQUAL 0)
            message(STATUS "✅ ccache 配置已应用")
        else()
            message(WARNING "⚠️  ccache 配置可能未生效，请检查权限")
        endif()
        message(STATUS "")
        message(STATUS "💡 查看 ccache 统计（使用正确的配置）：")
        message(STATUS "   export CCACHE_DIR=${CCACHE_DIR}")
        message(STATUS "   export CCACHE_CONFIGPATH=${CCACHE_CONFIG_FILE}")
        message(STATUS "   ccache -s")
        message(STATUS "或使用 wrapper 脚本查看统计：")
        message(STATUS "   ${CMAKE_BINARY_DIR}/ccache_launcher.sh -s")
        
        # 注意：distcc 配置已移动到 DistccConfig.cmake 模块
        # 这里只处理 ccache 和 distcc 的组合 launcher
        
        # 检查 distcc 配置文件，确保 DISTCC_ENABLED 设置被尊重
        set(DISTCC_ENABLED_IN_CONFIG TRUE)
        set(DISTCC_CONFIG_FILE "")
        if(EXISTS "${CMAKE_SOURCE_DIR}/.distcc.conf")
            set(DISTCC_CONFIG_FILE "${CMAKE_SOURCE_DIR}/.distcc.conf")
        elseif(EXISTS "${CMAKE_SOURCE_DIR}/ci/distcc.conf")
            set(DISTCC_CONFIG_FILE "${CMAKE_SOURCE_DIR}/ci/distcc.conf")
        endif()
        
        # 🔥 关键：从配置文件中提取 distcc 环境变量设置（用于 CompileCache launcher）
        set(DISTCC_FALLBACK_FROM_CONFIG "")
        set(DISTCC_SKIP_LOCAL_RETRY_FROM_CONFIG "")
        set(DISTCC_IO_TIMEOUT_FROM_CONFIG "")
        set(DISTCC_VERBOSE_FROM_CONFIG "")
        set(DISTCC_SAVE_TEMPS_FROM_CONFIG "")
        
        if(DISTCC_CONFIG_FILE)
            file(READ "${DISTCC_CONFIG_FILE}" DISTCC_CONFIG_CONTENT_FOR_COMPILECACHE)
            if(DISTCC_CONFIG_CONTENT_FOR_COMPILECACHE MATCHES "DISTCC_ENABLED=no")
                set(DISTCC_ENABLED_IN_CONFIG FALSE)
            elseif(DISTCC_CONFIG_CONTENT_FOR_COMPILECACHE MATCHES "DISTCC_ENABLED=yes")
                set(DISTCC_ENABLED_IN_CONFIG TRUE)
            endif()
            
            # 提取 distcc 环境变量设置（使用与 DistccConfig.cmake 相同的逻辑）
            string(REPLACE "\n" ";" CONFIG_LINES_FOR_VARS "${DISTCC_CONFIG_CONTENT_FOR_COMPILECACHE}")
            foreach(LINE ${CONFIG_LINES_FOR_VARS})
                string(STRIP "${LINE}" STRIPPED_LINE)
                if(STRIPPED_LINE)
                    string(REGEX MATCH "^[ \t]*#" IS_COMMENT "${STRIPPED_LINE}")
                    if(NOT IS_COMMENT)
                        # 提取 DISTCC_FALLBACK（支持带引号和不带引号的值）
                        if(STRIPPED_LINE MATCHES "DISTCC_FALLBACK[ \t]*=")
                            string(REGEX MATCH "DISTCC_FALLBACK[ \t]*=[ \t]*\"([^\"]+)\"" _ "${STRIPPED_LINE}")
                            if(CMAKE_MATCH_1)
                                set(DISTCC_FALLBACK_FROM_CONFIG "${CMAKE_MATCH_1}")
                            else()
                                string(REGEX MATCH "DISTCC_FALLBACK[ \t]*=[ \t]*'([^']+)'" _ "${STRIPPED_LINE}")
                                if(CMAKE_MATCH_1)
                                    set(DISTCC_FALLBACK_FROM_CONFIG "${CMAKE_MATCH_1}")
                                else()
                                    string(REGEX REPLACE ".*DISTCC_FALLBACK[ \t]*=[ \t]*([^ \t\n#]+).*" "\\1" DISTCC_FALLBACK_FROM_CONFIG "${STRIPPED_LINE}")
                                endif()
                            endif()
                        endif()
                        # 提取 DISTCC_SKIP_LOCAL_RETRY（支持带引号和不带引号的值）
                        if(STRIPPED_LINE MATCHES "DISTCC_SKIP_LOCAL_RETRY[ \t]*=")
                            string(REGEX MATCH "DISTCC_SKIP_LOCAL_RETRY[ \t]*=[ \t]*\"([^\"]+)\"" _ "${STRIPPED_LINE}")
                            if(CMAKE_MATCH_1)
                                set(DISTCC_SKIP_LOCAL_RETRY_FROM_CONFIG "${CMAKE_MATCH_1}")
                            else()
                                string(REGEX MATCH "DISTCC_SKIP_LOCAL_RETRY[ \t]*=[ \t]*'([^']+)'" _ "${STRIPPED_LINE}")
                                if(CMAKE_MATCH_1)
                                    set(DISTCC_SKIP_LOCAL_RETRY_FROM_CONFIG "${CMAKE_MATCH_1}")
                                else()
                                    string(REGEX REPLACE ".*DISTCC_SKIP_LOCAL_RETRY[ \t]*=[ \t]*([^ \t\n#]+).*" "\\1" DISTCC_SKIP_LOCAL_RETRY_FROM_CONFIG "${STRIPPED_LINE}")
                                endif()
                            endif()
                        endif()
                        # 提取 DISTCC_IO_TIMEOUT（支持带引号和不带引号的值）
                        if(STRIPPED_LINE MATCHES "DISTCC_IO_TIMEOUT[ \t]*=")
                            string(REGEX MATCH "DISTCC_IO_TIMEOUT[ \t]*=[ \t]*\"([^\"]+)\"" _ "${STRIPPED_LINE}")
                            if(CMAKE_MATCH_1)
                                set(DISTCC_IO_TIMEOUT_FROM_CONFIG "${CMAKE_MATCH_1}")
                            else()
                                string(REGEX MATCH "DISTCC_IO_TIMEOUT[ \t]*=[ \t]*'([^']+)'" _ "${STRIPPED_LINE}")
                                if(CMAKE_MATCH_1)
                                    set(DISTCC_IO_TIMEOUT_FROM_CONFIG "${CMAKE_MATCH_1}")
                                else()
                                    string(REGEX REPLACE ".*DISTCC_IO_TIMEOUT[ \t]*=[ \t]*([^ \t\n#]+).*" "\\1" DISTCC_IO_TIMEOUT_FROM_CONFIG "${STRIPPED_LINE}")
                                endif()
                            endif()
                        endif()
                        # 提取 DISTCC_VERBOSE（支持带引号和不带引号的值）
                        if(STRIPPED_LINE MATCHES "DISTCC_VERBOSE[ \t]*=")
                            string(REGEX MATCH "DISTCC_VERBOSE[ \t]*=[ \t]*\"([^\"]+)\"" _ "${STRIPPED_LINE}")
                            if(CMAKE_MATCH_1)
                                set(DISTCC_VERBOSE_FROM_CONFIG "${CMAKE_MATCH_1}")
                            else()
                                string(REGEX MATCH "DISTCC_VERBOSE[ \t]*=[ \t]*'([^']+)'" _ "${STRIPPED_LINE}")
                                if(CMAKE_MATCH_1)
                                    set(DISTCC_VERBOSE_FROM_CONFIG "${CMAKE_MATCH_1}")
                                else()
                                    string(REGEX REPLACE ".*DISTCC_VERBOSE[ \t]*=[ \t]*([^ \t\n#]+).*" "\\1" DISTCC_VERBOSE_FROM_CONFIG "${STRIPPED_LINE}")
                                endif()
                            endif()
                        endif()
                        # 提取 DISTCC_SAVE_TEMPS（支持带引号和不带引号的值）
                        if(STRIPPED_LINE MATCHES "DISTCC_SAVE_TEMPS[ \t]*=")
                            string(REGEX MATCH "DISTCC_SAVE_TEMPS[ \t]*=[ \t]*\"([^\"]+)\"" _ "${STRIPPED_LINE}")
                            if(CMAKE_MATCH_1)
                                set(DISTCC_SAVE_TEMPS_FROM_CONFIG "${CMAKE_MATCH_1}")
                            else()
                                string(REGEX MATCH "DISTCC_SAVE_TEMPS[ \t]*=[ \t]*'([^']+)'" _ "${STRIPPED_LINE}")
                                if(CMAKE_MATCH_1)
                                    set(DISTCC_SAVE_TEMPS_FROM_CONFIG "${CMAKE_MATCH_1}")
                                else()
                                    string(REGEX REPLACE ".*DISTCC_SAVE_TEMPS[ \t]*=[ \t]*([^ \t\n#]+).*" "\\1" DISTCC_SAVE_TEMPS_FROM_CONFIG "${STRIPPED_LINE}")
                                endif()
                            endif()
                        endif()
                    endif()
                endif()
            endforeach()
        endif()
        
        # 设置默认值（如果配置文件中没有设置）
        # 🔥 关键：使用 STREQUAL "" 检查是否为空，而不是 NOT，因为 "0" 在 CMake 中被视为假值
        if(DISTCC_FALLBACK_FROM_CONFIG STREQUAL "")
            set(DISTCC_FALLBACK_FROM_CONFIG "1")
        endif()
        if(DISTCC_SKIP_LOCAL_RETRY_FROM_CONFIG STREQUAL "")
            set(DISTCC_SKIP_LOCAL_RETRY_FROM_CONFIG "0")
        endif()
        if(DISTCC_IO_TIMEOUT_FROM_CONFIG STREQUAL "")
            set(DISTCC_IO_TIMEOUT_FROM_CONFIG "600")
        endif()
        if(DISTCC_VERBOSE_FROM_CONFIG STREQUAL "")
            set(DISTCC_VERBOSE_FROM_CONFIG "0")
        endif()
        if(DISTCC_SAVE_TEMPS_FROM_CONFIG STREQUAL "")
            set(DISTCC_SAVE_TEMPS_FROM_CONFIG "0")
        endif()
        
        # 创建 ccache-distcc launcher（如果需要，由 DistccConfig 设置）
        # 注意：这里检查环境变量，但会在 DistccConfig.cmake 执行后重新创建 launcher
        # 如果配置文件中 DISTCC_ENABLED=no，即使环境变量设置了 DISTCC_HOSTS，也不使用 distcc
        if(DISTCC_ENABLED_IN_CONFIG AND DEFINED ENV{DISTCC_HOSTS} AND ENV{DISTCC_HOSTS})
            # 获取 DISTCC_HOSTS 的值（硬编码到脚本中，避免运行时环境变量丢失）
            set(DISTCC_HOSTS_VALUE "$ENV{DISTCC_HOSTS}")
            
            # 创建组合 launcher 脚本
            set(CCACHE_DISTCC_LAUNCHER "${CMAKE_BINARY_DIR}/ccache_distcc_launcher.sh")
            file(WRITE "${CCACHE_DISTCC_LAUNCHER}" "#!/bin/bash
# ccache-distcc 组合 launcher
# 🔥 关键：强制设置 CCACHE_DIR，确保使用构建目录下的缓存
export CCACHE_DIR=\"${CCACHE_DIR}\"
# 🔥 关键：设置 CCACHE_PATH，确保 distcc 调用真实编译器，不是 ccache 包装器
# 排除所有 ccache 目录，避免递归调用
export CCACHE_PATH=\"/usr/bin:/usr/local/bin\"
export CCACHE_PREFIX=\"distcc\"
# 🔥 关键：硬编码 DISTCC_HOSTS，不依赖运行时环境变量（CLion 等 IDE 需要）
export DISTCC_HOSTS=\"${DISTCC_HOSTS_VALUE}\"
# 🔥 关键：设置 DISTCC_PATH，确保 distccd 调用真实编译器，不是 ccache 包装器
# 这会影响 distcc 客户端和 distccd 服务器端
export DISTCC_PATH=\"/usr/bin:/usr/local/bin\"
# 🔥 关键：设置 PATH，确保 distcc 和 distccd 调用真实编译器
# 移除所有 ccache 目录，避免递归调用
# 标准路径必须在最前面
export PATH=\"/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/bin:/sbin\"
# 🔥 关键：使用配置文件中的值，而不是硬编码
export DISTCC_FALLBACK=\"${DISTCC_FALLBACK_FROM_CONFIG}\"
export DISTCC_SKIP_LOCAL_RETRY=\"${DISTCC_SKIP_LOCAL_RETRY_FROM_CONFIG}\"
export DISTCC_IO_TIMEOUT=\"${DISTCC_IO_TIMEOUT_FROM_CONFIG}\"
export DISTCC_VERBOSE=\"${DISTCC_VERBOSE_FROM_CONFIG}\"
export DISTCC_SAVE_TEMPS=\"${DISTCC_SAVE_TEMPS_FROM_CONFIG}\"
# 🔥 关键：清除 shell 的路径缓存，确保使用新的 PATH
hash -r 2>/dev/null || true
# 🔥 关键：验证编译器路径（调试用，可以注释掉）
# if [ \"\$DISTCC_VERBOSE\" = \"1\" ]; then
#     echo \"[DEBUG] PATH: \$PATH\" >&2
#     echo \"[DEBUG] DISTCC_PATH: \$DISTCC_PATH\" >&2
#     echo \"[DEBUG] which gcc: \$(which gcc 2>&1)\" >&2
#     echo \"[DEBUG] which clang: \$(which clang 2>&1)\" >&2
# fi
# 每次调用都设置缓存目录（覆盖配置文件中的设置）
# 使用 --set-config 确保配置生效
${CCACHE_PROGRAM} --set-config cache_dir=\"${CCACHE_DIR}\" >/dev/null 2>&1 || true
# 执行 ccache（会使用上面设置的 CCACHE_DIR 环境变量）
exec ${CCACHE_PROGRAM} \"\$@\"
")
            # 设置文件执行权限（兼容 CMake 3.10+）
            if(UNIX)
                execute_process(
                    COMMAND chmod +x "${CCACHE_DISTCC_LAUNCHER}"
                    OUTPUT_QUIET
                    ERROR_QUIET
                )
            endif()
            
            set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_DISTCC_LAUNCHER}" CACHE STRING "C compiler launcher")
            set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_DISTCC_LAUNCHER}" CACHE STRING "CXX compiler launcher")
            
            message(STATUS "Launcher: ${CCACHE_DISTCC_LAUNCHER}")
            message(STATUS "  使用 distcc 主机: ${DISTCC_HOSTS_VALUE}")
            message(STATUS "  缓存目录: ${CCACHE_DIR}")
        else()
            # 只使用 ccache，创建一个包装脚本确保使用正确的缓存目录
            set(CCACHE_LAUNCHER "${CMAKE_BINARY_DIR}/ccache_launcher.sh")
            file(WRITE "${CCACHE_LAUNCHER}" "#!/bin/bash
# ccache launcher（确保使用正确的缓存目录）
# 🔥 关键：强制设置 CCACHE_DIR 和 CCACHE_CONFIGPATH，确保使用构建目录下的缓存
export CCACHE_DIR=\"${CCACHE_DIR}\"
export CCACHE_CONFIGPATH=\"${CCACHE_CONFIG_FILE}\"
# 执行 ccache（会使用 CCACHE_DIR 和 CCACHE_CONFIGPATH 环境变量）
exec ${CCACHE_PROGRAM} \"\$@\"
")
            # 设置文件执行权限（兼容 CMake 3.10+）
            if(UNIX)
                execute_process(
                    COMMAND chmod +x "${CCACHE_LAUNCHER}"
                    OUTPUT_QUIET
                    ERROR_QUIET
                )
            endif()
            
            set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_LAUNCHER}" CACHE STRING "C compiler launcher")
            set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_LAUNCHER}" CACHE STRING "CXX compiler launcher")
            
            message(STATUS "Launcher: ${CCACHE_LAUNCHER}")
            message(STATUS "  缓存目录: ${CCACHE_DIR}")
        endif()
        
        message(STATUS "")
        message(STATUS "📊 预期加速效果:")
        message(STATUS "   首次编译: 正常速度（建立缓存）")
        message(STATUS "   后续编译: 10-20 倍加速 ⚡⚡⚡")
        message(STATUS "")
        message(STATUS "💡 实用命令:")
        message(STATUS "   查看统计: ccache -s")
        message(STATUS "   清空缓存: ccache -C")
        message(STATUS "   清零统计: ccache -z")
        message(STATUS "")
        message(STATUS "💡 CMake 目标:")
        message(STATUS "   cmake --build . --target ccache-stats    # 查看统计")
        message(STATUS "   cmake --build . --target ccache-clean   # 清理缓存")
        message(STATUS "   cmake --build . --target ccache-zero     # 清零统计")
        message(STATUS "========================================")
        
        # 创建便捷的 CMake 目标
        add_custom_target(ccache-stats
            COMMAND ${CCACHE_PROGRAM} -s
            COMMENT "查看 ccache 缓存统计"
            VERBATIM
        )
        
        add_custom_target(ccache-clean
            COMMAND ${CCACHE_PROGRAM} -C
            COMMAND ${CMAKE_COMMAND} -E echo "✅ ccache 缓存已清理"
            COMMENT "清理 ccache 缓存（释放磁盘空间）"
            VERBATIM
        )
        
        add_custom_target(ccache-zero
            COMMAND ${CCACHE_PROGRAM} -z
            COMMAND ${CMAKE_COMMAND} -E echo "✅ ccache 统计已清零"
            COMMENT "清零 ccache 统计计数器（保留缓存）"
            VERBATIM
        )
    else()
        # 未找到 ccache
        message(STATUS "========================================")
        message(STATUS "⚠️  未找到 ccache")
        message(STATUS "========================================")
        message(STATUS "将使用标准编译（无缓存加速）")
        message(STATUS "")
        message(STATUS "💡 要启用 10-20 倍编译加速:")
        message(STATUS "  Ubuntu/Debian: sudo apt-get install ccache")
        message(STATUS "  CentOS/RHEL:   sudo yum install ccache")
        message(STATUS "  然后重新运行 CMake 配置")
        message(STATUS "")
        message(STATUS "📖 详细文档: docs/ccache使用指南.md")
        message(STATUS "========================================")
    endif()
endif()

